﻿#define  _CRT_SECURE_NO_WARNINGS

#include <iostream>
using namespace std;

//class Sum
//{
//public:
//	Sum()
//	{
//		_ret += _i;
//		++_i;
//	}
//
//	static int GetSum()
//	{
//		return _ret;
//	}
//
//private:
//	static int _i;
//	static int _ret;
//};
//
//int Sum::_i = 1;
//int Sum::_ret = 0;
//
//class solution
//{
//public:
//	int SumSolution(int n)
//	{
//		Sum arr[5];
//		return Sum::GetSum();
//	}
//};
//
//int main()
//{
//	solution st;
//	cout << st.SumSolution(5) << endl;
//	return 0;
//}

//// 前置声明，否则A的友元函数声明编译器不认识B
//class B;
//class A
//{
//	// 友元声明
//	friend void func(const A& aa, const B& bb);
//private:
//	int _a1 = 1;
//	int _a2 = 2;
//};
//
//class B
//{
//	// 友元声明
//	friend void func(const A& aa, const B& bb);
//private:
//	int _b1 = 3;
//	int _b2 = 4;
//};
//
//void func(const A& aa, const B& bb)
//{
//	cout << aa._a1 << endl;
//	cout << bb._b1 << endl;
//}
//
//int main()
//{
//	A aa;
//	B bb;
//	func(aa, bb);
//	return 0;
//}

//#include<iostream>
//using namespace std;
//
//class A
//{
//public:
//	class B // B默认就是A的友元
//	{
//	public:
//		void foo(const A& a)
//		{
//			cout << _k << endl; //OK
//			cout << a._h << endl; //OK
//		}
//	};
//private:
//	static int _k;
//	int _h = 1;
//};
//
//int A::_k = 1;
//
//int main()
//{
//	cout << sizeof(A) << endl;
//	A::B b;
//	A aa;
//	b.foo(aa);
//	return 0;
//}

//class Solution {
//public:
//	int Sum_Solution(int n) {
//		Sum arr[n];
//		return _ret;
//	}
//private:
//	class Sum
//	{
//	public:
//		Sum()
//		{
//			_ret += _i;
//			++_i;
//		}
//	};
//	static int _i;
//	static int _ret;
//};
//
//int Solution::_i = 1;
//int Solution::_ret = 0;

//class A
//{
//public :
//	A(int a = 0)
//		:_a(a)
//	{
//		cout << "A(int a)" << endl;
//	} 
//
//	~A()
//	{
//		cout << "~A()" << endl;
//	}
//
//private:
//	int _a;
//};
//
//class Solution {
//public:
//	int Sum_Solution(int n) {
//		//...
//		return n;
//	}
//};
//
//int main()
//{
//	A aa1;
//
//	// 不能这么定义对象，因为编译器⽆法识别下⾯是⼀个函数声明，还是对象定义
//	//A aa1();
//	
//	// 但是我们可以这么定义匿名对象，匿名对象的特点不⽤取名字
//	// 但是他的⽣命周期只有这⼀⾏，下⼀⾏他就会⾃动调⽤析构函数
//	A();
//	A(1);
//	A aa2(2);
//
//	// 匿名对象在这样场景下就很好⽤，单纯想调用类中的一个函数
//	Solution().Sum_Solution(10);
//
//	return 0;
//}